# TODO: 导入必要的库和模块
import gradio as gr
import numpy as np
import pickle
from sklearn.preprocessing import StandardScaler
from PIL import Image
from sklearn import datasets
import base64

# TODO: 加载保存的KNN模型，这样我们可以使用预训练的模型进行预测
with open('best_knn_model.pkl', 'rb') as file:
    knn = pickle.load(file)

# 加载训练数据集
digits = datasets.load_digits()

scaler = StandardScaler()
scaler.fit(digits.data)

# TODO: 定义预测函数，这个函数将用于Gradio接口进行预测
 
def predict_digit(image):

    
    # 将图像转换为 numpy 数组
    image_array = np.array(image)
    # 将图像数组展平
    image_array = image_array.flatten()
    # 特征缩放
    image_array = scaler.transform([image_array])
    # 使用模型进行预测
    prediction = knn.predict([image_array])
    # 返回预测结果
    return prediction[0]
print(Image)
# TODO: 创建Gradio接口，这个接口将用于用户输入和显示预测结果
iface = gr.Interface(
    fn=predict_digit,
    inputs="sketchpad",
    outputs="label",
    title="Handwritten Digit Recognition",
    description="Upload a handwritten digit image to be classified."
)

# TODO: 启动Gradio接口，用户可以通过这个接口进行交互
iface.launch()